package cn.kone.util;


import com.alibaba.fastjson.JSON;
import com.wechat.pay.java.core.Config;
import com.wechat.pay.java.core.RSAAutoCertificateConfig;
import com.wechat.pay.java.service.payments.jsapi.JsapiServiceExtension;
import com.wechat.pay.java.service.payments.jsapi.model.Amount;
import com.wechat.pay.java.service.payments.jsapi.model.Payer;
import com.wechat.pay.java.service.payments.jsapi.model.PrepayRequest;
import com.wechat.pay.java.service.payments.jsapi.model.PrepayWithRequestPaymentResponse;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.web.client.RestTemplate;

import java.util.HashMap;
import java.util.Map;

public class WeChatUtil {


    public static String appid = "wx2b12f5643aff0fc1";
    /** 商户号 */
    public static String merchantId = "1637705483";
    /** 商户API私钥路径 */
    public static String privateKeyPath = "E:\\repeater\\飞驰代驾项目\\day17_发送账单\\资料\\支付材料\\apiclient_key.pem";//
    /** 商户证书序列号 */
    public static String merchantSerialNumber = "1B5FCE6A83E2CD2F55441857E978F8AF7B8D85F4";
    /** 商户APIV3密钥 */
    public static String apiV3key = "KkaXVb5fYsGqN998GS8pqoCVghhrpoW6";

    public static PrepayWithRequestPaymentResponse prepayWithRequestPayment(Integer total, String openid, String description, String outTradeNo) {
        // 使用自动更新平台证书的RSA配置
        // 一个商户号只能初始化一个配置，否则会因为重复的下载任务报错
        Config config =
                new RSAAutoCertificateConfig.Builder()
                        .merchantId(merchantId)
                        .privateKeyFromPath(privateKeyPath)
                        .merchantSerialNumber(merchantSerialNumber)
                        .apiV3Key(apiV3key)
                        .build();

        // 构建service
        JsapiServiceExtension service = new JsapiServiceExtension.Builder().config(config).build();

        // request.setXxx(val)设置所需参数，具体参数可见Request定义
        PrepayRequest request = new PrepayRequest();
        Amount amount = new Amount();
        amount.setTotal(total);//单位是分,核心参数订单金额,个推用用户id就是乘客id
        request.setAmount(amount);

        Payer payer = new Payer();//跟快速入门比多了的部分
        payer.setOpenid("oEXuG64R9yaNAE7eqpLNQEs_53cs");//跟快速入门比多了的部分,支付人即乘客openid,登录存到redis
        request.setPayer(payer);//跟快速入门比多了的部分

        request.setAppid(appid);
        request.setMchid(merchantId);

        request.setDescription(description);//核心参数,订单描述
        request.setNotifyUrl("https://notify_url");//!!!
        request.setOutTradeNo(outTradeNo);

        // 调用下单方法，得到应答
        PrepayWithRequestPaymentResponse response = service.prepayWithRequestPayment(request);//
        System.out.println(response);//response包含了调起支付所需的所有参数，可直接用于前端调起支付
        return response;
    }

    public static String getAccesstoken() {
        String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=wx76a39daa4e95dca8&secret=54ca332e7c4d0bc391cc24d1fcdfdc89";
        String json = new RestTemplate().getForObject(url, String.class);
        System.out.println(json);

        Map map = JSON.parseObject(json, Map.class);
        System.out.println(map);

        String access_token = (String) map.get("access_token");
        System.out.println(access_token);
        return access_token;
    }

    public static void main(String[] args) {
        getAccesstoken();
    }
    public static void sendPs() {

        /**
         * 这段代码主要分为以下几个步骤：
         * 1.构建发送订阅消息的接口地址，并获取访问令牌(access_token)。
         * 2.设置请求头部信息，指定请求的内容类型为JSON格式。
         * 3.构建请求体，包含发送订阅消息的相关参数，如模板ID、接收消息的用户openid、小程序状态、消息模板的语言、点击消息跳转的小程序页面路径等。
         * 4.构建订阅消息的数据内容，这里使用自定义的数据类 MyData。
         * 5.构建HTTP请求实体，包含请求头和请求体。
         * 6.发送POST请求，将订阅消息发送给微信用户，并获取返回结果（JSON字符串）。
         * 7.输出返回结果。
         */

        // 构建发送订阅消息的接口地址
        String url = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token="+getAccesstoken();

        // 设置请求头部信息
        HttpHeaders headers = new HttpHeaders();
        //json格式,接受头,ct内容类型  // 指定请求的内容类型为JSON格式
        headers.setContentType(MediaType.parseMediaType("application/json;charset=utf-8"));
        // 指定接受的数据类型为JSON
        headers.add("Accept", MediaType.APPLICATION_JSON.toString());

        // 构建请求体，包含发送订阅消息的相关参数
        HashMap<String,Object> body = new HashMap();
        body.put("template_id", "zCAz-4yhYLGLbNGGBdgJIyVfywLWuxSsbNBzN0zupSE"); // 订阅消息模板ID
        body.put("touser", "oEXuG64R9yaNAE7eqpLNQEs_53cs");// 接收消息的用户openid
        body.put("miniprogram_state", "developer");// 小程序状态，可选值：formal（正式）、developer（开发者）
        body.put("lang", "zh_CN");// 消息模板的语言，这里设置为中文
        body.put("page", "/pages/order/order?orderNo=1776470481923211264");// 点击消息跳转的小程序页面路径，这里是订单页面
        // 构建订阅消息的数据内容，MyData是自定义的数据类
        MyData myData = new MyData("15765682061692", "200.00元", "请您尽快支付代驾费用");
        body.put("data", myData);

        // 构建HTTP请求实体
        HttpEntity<HashMap> httpEntity = new HttpEntity(body, headers);
        // 发送POST请求，并获取返回结果（JSON字符串）
        String json = new RestTemplate().postForObject(url, httpEntity, String.class);//核心代码,httpEntity
        // 输出返回结果
        System.out.println(json);
    }
}

@Data
@NoArgsConstructor
class MyData{
    private MyObject character_string1;
    private MyObject amount2;
    private MyObject thing3;

    //通过构造方法给成员变量赋值↓
    public MyData(String value1, String value2, String value3) {
        this.character_string1 = new MyObject(value1);
        this.amount2 = new MyObject(value2);;
        this.thing3 = new MyObject(value3);;
    }
}

@Data
@AllArgsConstructor
@NoArgsConstructor
class MyObject {
    private String value;
}